public class Service {

    // 产品数组
    private final Products[] elements;

    // 当前数组中元素数量
    private int size;

    // 数组的最大容量
    private final int maxLength;

    // 默认容量常量
    private final static int DEFAULT_LENGTH = 12;

    // 获取当前元素数量
    public int getSize() {
        return size;
    }

    // 判断数组是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    // 判断数组是否已满
    public boolean isFull() {
        return size == maxLength;
    }

    // 构造函数，根据传入的长度初始化数组
    public Service(int length) {
        if (length <= 0) {
            // 如果长度非法，使用默认长度进行初始化
            elements = new Products[DEFAULT_LENGTH + (DEFAULT_LENGTH >>> 1)];
            maxLength = DEFAULT_LENGTH;
        } else {
            // 使用传入的长度进行初始化
            elements = new Products[length + 1];
            maxLength = length;
        }
    }

    // 添加产品到数组末尾
    public boolean add(Products p) {
        if (size == maxLength) {
            // 数组已满，无法添加
            return false;
        }
        if (p != null) {
            // 将产品添加到数组末尾并增加元素数量
            elements[size++] = p;
            return true;
        } else {
            // 传入的产品为空，无法添加
            return false;
        }
    }

    // 根据产品名称删除产品
    public boolean delete(String name) {
        int index = -1;
        // 查找产品在数组中的索引
        for (int i = 0; i < size; i++) {
            if (elements[i].getName().equals(name)) {
                index = i;
                break;
            }
        }
        // 检查索引是否合法
        if (checkIllegalIndex(index)) {
            return false;
        } else {
            // 删除指定索引处的产品
            delete(index);
            size--;
            return true;
        }
    }

    // 根据索引删除产品
    public boolean delete(int index) {
        // 检查索引是否合法
        if (checkIllegalIndex(index)) {
            return false;
        }
        // 将指定索引后的产品依次往前移动
        for (int i = index + 1; i < size; i++) {
            elements[i] = elements[i + 1];
        }
        size--;
        return true;
    }

    // 修改指定索引处的产品
    public boolean modify(Products newP, int index) {
        // 检查索引是否合法
        if (checkIllegalIndex(index)) {
            return false;
        }
        // 修改指定索引处的产品
        elements[index] = newP;
        return true;
    }

    // 根据索引获取产品
    public Products get(int index) {
        // 检查索引是否合法
        if (checkIllegalIndex(index)) {
            return null;
        } else {
            // 返回指定索引处的产品
            return elements[index];
        }
    }

    // 根据产品名称获取产品
    public Products get(String name) {
        int index = -1;
        // 查找产品在数组中的索引
        for (int i = 0; i < size; i++) {
            if (elements[i].getName().equals(name)) {
                index = i;
                break;
            }
        }
        // 检查索引是否合法
        if (checkIllegalIndex(index)) {
            return null;
        } else {
            // 返回指定索引处的产品
            return get(index);
        }
    }

    // 检查索引是否非法
    private boolean checkIllegalIndex(int index) {
        return index < 0 || index >= size;
    }

    // 重写toString方法，以字符串形式返回数组中的产品信息
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        // 遍历数组，将产品信息添加到字符串中
        for (int i = 0; i < size; i++) {
            sb.append(String.format("%-8d", i + 1)).append(elements[i]).append("\n");
        }
        return sb.toString();
    }
}
